package com.qf.listener;

import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 接收消息 监听器
 *
 * @author lixu
 */
@Component
@Slf4j
public class ReceverMessageListener {

    /**
     * 简单模式  接收消息
     */
    //@RabbitHandler
    //@RabbitListener(queues = {"hello"})
    public void receiverMessage(String msg, Channel channel, Message message) {
        try {
            System.out.println("接收到的消息:" + msg);
            //保存订单啊  保存订单详情
            //删除购物车
            int i = 1 / 0;
            //long deliveryTag： 消息的标记
            //boolean multiple : 是否批量应答
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            //给一次机会 将当前的消息再重新消费一次呢？
            //当前消息是否被投递过
            if(message.getMessageProperties().isRedelivered()){
                //当前消息是被投递过的
                //拒绝处理此消息
                //long deliveryTag： 消息的标记
                //是否重新放回队列   放回 ready    队列那边执行删除
                try {
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
                    //记录到日志中去
                    log.error("当前消息是被投递过的:{}", JSONObject.toJSONString(message));
                    //调用人工处理接口  实例人 给工程师 发邮箱  发短信  报警
                } catch (IOException ex) {
                    ex.printStackTrace();
                }

            }else{
                //当前消息未被投递过
                //long deliveryTag： 消息的标记
                //boolean multiple : 是否批量应答
                //是否重新放回队列   放回 ready
                try {
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }


        }


    }

    /**
     * 工作模式   接收消息
     */
    //@RabbitHandler
    @RabbitListener(queues = {"queue1"})
    public void workQueues1receiverMessage(String msg) {

        System.out.println("1接收到的消息:" + msg);

        //......................
    }

    /**
     * 工作模式   接收消息
     */
    //@RabbitHandler
    @RabbitListener(queues = {"queue2"})
    public void workQueues2receiverMessage(String msg) {

        System.out.println("2接收到的消息:" + msg);

        //......................
    }

    /**
     * 主题模式     接收消息
     */
    //@RabbitHandler
    @RabbitListener(queues = {"Q1"})
    public void workQ1receiverMessage(String msg) {

        System.out.println("Q1接收到的消息:" + msg);

        //......................
    }

    /**
     * 主题模式     接收消息
     */
    //@RabbitHandler
    @RabbitListener(queues = {"Q2"})
    public void workQ2receiverMessage(String msg) {

        System.out.println("Q2接收到的消息:" + msg);

        //......................
    }
}
